#include "jpeg.h"

JPEG_HandleTypeDef hjpeg;

void JPEG_Init(void)
{
	hjpeg.Instance = JPEG;
	HAL_JPEG_Init(&hjpeg); 
}

void HAL_JPEG_MspInit(JPEG_HandleTypeDef *hjpeg)
{
	static MDMA_HandleTypeDef   hmdmaIn;
	static MDMA_HandleTypeDef   hmdmaOut;  

	/* 使能JPEG时钟 */
	__HAL_RCC_JPGDECEN_CLK_ENABLE();

	/* 使能MDMA时钟 */
	__HAL_RCC_MDMA_CLK_ENABLE();

	/* 使能JPEG中断并配置优先级 */
	HAL_NVIC_SetPriority(JPEG_IRQn, 7, 0);
	HAL_NVIC_EnableIRQ(JPEG_IRQn);  
	
	/* JPEG输入的MDMA配置 ###########################################*/
	hmdmaIn.Instance                = MDMA_Channel1;                   /* 使用MDMA通道1 */
	hmdmaIn.Init.Priority           = MDMA_PRIORITY_HIGH;              /* 优先级高 */
	hmdmaIn.Init.Endianness         = MDMA_LITTLE_ENDIANNESS_PRESERVE; /* 小端格式 */
	hmdmaIn.Init.SourceInc          = MDMA_SRC_INC_BYTE;               /* 源地址字节递增 */
	hmdmaIn.Init.DestinationInc     = MDMA_DEST_INC_DISABLE;           /* 目的地址无自增 */
	hmdmaIn.Init.SourceDataSize     = MDMA_SRC_DATASIZE_BYTE;          /* 源地址数据宽度字节 */
	hmdmaIn.Init.DestDataSize       = MDMA_DEST_DATASIZE_WORD;         /* 目的地址数据宽度字节 */
	hmdmaIn.Init.DataAlignment      = MDMA_DATAALIGN_PACKENABLE;       /* 小端，右对齐 */
	hmdmaIn.Init.SourceBurst        = MDMA_SOURCE_BURST_32BEATS;       /* 源数据突发传输，32次 */
	hmdmaIn.Init.DestBurst          = MDMA_DEST_BURST_32BEATS;         /* 目的数据突发传输，32次 */
	
	hmdmaIn.Init.SourceBlockAddressOffset = 0;  /* 用于block传输，buffer传输用不到 */
	hmdmaIn.Init.DestBlockAddressOffset   = 0;  /* 用于block传输，buffer传输用不到 */
  
	hmdmaIn.Init.Request = MDMA_REQUEST_JPEG_INFIFO_TH;  	 /* JPEG的FIFO阀值触发中断 */
	hmdmaIn.Init.TransferTriggerMode = MDMA_BUFFER_TRANSFER; /* 使用MDMA的buffer传输 */
	hmdmaIn.Init.BufferTransferLength = 32;                  /* 每次传输32个字节，JPEG的FIFO阀值是32字节 */

	/* 关联MDMA的句柄到JPEG */
	__HAL_LINKDMA(hjpeg, hdmain, hmdmaIn);

	/* 先复位，然后配置MDMA */
	HAL_MDMA_DeInit(&hmdmaIn); 
	HAL_MDMA_Init(&hmdmaIn);

	/* JPEG输出的MDMA配置 ###########################################*/
	hmdmaOut.Instance             = MDMA_Channel0;                   /* 使用MDMA通道0 */
	hmdmaOut.Init.Priority        = MDMA_PRIORITY_VERY_HIGH;         /* 优先级最高 */
	hmdmaOut.Init.Endianness      = MDMA_LITTLE_ENDIANNESS_PRESERVE; /* 小端格式 */
	hmdmaOut.Init.SourceInc       = MDMA_SRC_INC_DISABLE;            /* 源数据地址禁止自增 */
	hmdmaOut.Init.DestinationInc  = MDMA_DEST_INC_BYTE;              /* 目的数据地址字节自增 */
	hmdmaOut.Init.SourceDataSize  = MDMA_SRC_DATASIZE_WORD;          /* 源地址数据宽度字 */
	hmdmaOut.Init.DestDataSize    = MDMA_DEST_DATASIZE_BYTE;         /* 目的地址数据宽度字节 */
	hmdmaOut.Init.DataAlignment   = MDMA_DATAALIGN_PACKENABLE;       /* 小端，右对齐 */  
	hmdmaOut.Init.SourceBurst     = MDMA_SOURCE_BURST_32BEATS;       /* 源数据突发传输，32次 */
	hmdmaOut.Init.DestBurst       = MDMA_DEST_BURST_32BEATS;         /* 目的数据突发传输，32次 */
	
	hmdmaOut.Init.SourceBlockAddressOffset = 0;  /* 用于block传输，buffer传输用不到 */
	hmdmaOut.Init.DestBlockAddressOffset   = 0;  /* 用于block传输，buffer传输用不到 */

	hmdmaOut.Init.Request              = MDMA_REQUEST_JPEG_OUTFIFO_TH;  /* JPEG的FIFO阀值触发中断 */
	hmdmaOut.Init.TransferTriggerMode  = MDMA_BUFFER_TRANSFER;          /* 使用MDMA的buffer传输 */ 
	hmdmaOut.Init.BufferTransferLength = 32;                            /* 每次传输32个字节，JPEG的FIFO阀值是32字节 */

	/* 先复位，然后配置MDMA */
	HAL_MDMA_DeInit(&hmdmaOut);  
	HAL_MDMA_Init(&hmdmaOut);

	/* 关联MDMA的句柄到JPEG */
	__HAL_LINKDMA(hjpeg, hdmaout, hmdmaOut);

	/* 使能MDMA中断并配置优先级 */
	HAL_NVIC_SetPriority(MDMA_IRQn, 8, 0);
	HAL_NVIC_EnableIRQ(MDMA_IRQn);
}

void JPEG_IRQHandler(void)
{
	HAL_JPEG_IRQHandler(&hjpeg);
}

void MDMA_IRQHandler(void)
{
	HAL_MDMA_IRQHandler(hjpeg.hdmain);
	HAL_MDMA_IRQHandler(hjpeg.hdmaout);  
}
